package com.aleyn.annotation

/**
 * @author : Aleyn
 * @date : 2023/07/29 : 22:35
 *
 * 应用启动初始化注解。
 *
 * 此注解用于标记一个实现了 `com.aleyn.router.core.IInitializer` 接口的类，
 * 使其能够在应用程序启动时被自动调用，从而执行模块化的初始化任务。
 * 它的功能与 Google 的 `androidx.startup.Initializer` 类似，但实现方式不同。
 *
 * 工作原理：
 * 1. 在编译期间，KSP（或 APT）会扫描所有被 `@Initializer` 注解的类。
 * 2. 处理器将这些类的完全限定名收集起来，并生成一个统一的初始化管理类。
 * 3. 在应用启动时，LRouter 会加载这个生成的管理类，并根据注解参数（如 `priority` 和 `async`）
 *    来决定各个初始化任务的执行顺序和执行线程。
 *
 * 使用示例：
 * ```kotlin
 * // 标记这是一个高优先级的同步初始化任务
 * @Initializer(priority = 10, async = false)
 * class AnalyticsInitializer : IInitializer {
 *     override fun create(context: Context) {
 *         // 初始化分析 SDK
 *         AnalyticsSDK.init(context)
 *     }
 * }
 * ```
 *
 * @param priority 初始化任务的优先级。数值越大，优先级越高。默认值为 0。
 *                 高优先级的任务会先于低优先级的任务执行。
 * @param async    是否在后台线程中异步执行初始化任务。默认为 `false`，表示在主线程同步执行。
 *                 对于耗时的初始化操作，建议设置为 `true`，以避免阻塞主线程。
 */
@Retention(AnnotationRetention.BINARY)
@Target(AnnotationTarget.CLASS)
annotation class Initializer(val priority: Byte = 0, val async: Boolean = false)
